<?php

/**
 * ecshop ERP v1.0
 * ----------------------------------------------------------------------------
 * http://www.phpally.com
 * Jacklee的博客 致力于php技术
 * ----------------------------------------------------------------------------
 * 作者: Jacklee
 * 邮箱: jack349392900@gmail.com
 * 创建时间: 2013-11-18
 * 最后修改时间: 2013-11-18
 */

/**
 * 文件和目录处理类
 */

require_once(dirname(__FILE__) . '/cls_base.php');

class cls_file extends cls_base{
	
	private $path='';	

	public function cls_file($coding='utf-8')
	{
		$this->coding=$coding;
	}
	
	//public function __construct($coding='utf-8')
	//{
	//	$this->cls_file($coding);
	//}
	
	/*
	 * 返回路径列表
	 * 例如$dir="d:/temp/你/好";
	 * 返回
	 * Array
		(
    	[0] => d:/
    	[1] => d:/temp/
    	[2] => d:/temp/你/
   	 	[3] => d:/temp/你/好/
		)
		注意，返回的路径是gbk编码的。
	 */
	private function dir_list($dir)
	{
		$dir=preg_replace('/\\\/','/',$dir);
		$dir=preg_replace('|\/+|','/',$dir);		
		
		if($this->get_substr($dir,-1,1)=='/')
		{
			$dir=$this->get_substr($dir,0,$this->get_strlen($dir)-1);
		}
		
        if($this->is_utf8($dir))
   		{
   			$dir=iconv('utf-8','gbk',$dir); 
   		} 
		
		$dir_array=explode('/',$dir);

		if(!empty($dir_array))
		{
			foreach($dir_array as $k=>$v)
			{
				$temp.=$v.'/';
				$dir_list[]=$temp;
			}
		}
		
		return $dir_list;
	}
	

	/**
	 * 建立文件夹
	 */	
	public function create_dir($dir)
	{
		$dir=$this->transact_path($dir); 
		
        if($this->is_utf8($dir))
   		{
   			$dir=iconv('utf-8','gbk',$dir); 
   		} 		

		if(!empty($dir))
		{
			$dir_list=$this->dir_list($dir);
			foreach($dir_list as $k=>$v)
			{
				if(!file_exists($v))
				{
					if(!mkdir($v))
					{
						return false;
					}
				}
			}
		}
	}
     /**
      * 判断目录是否为空  
      */
     public function is_dir_empty($dir)
     {  
     	$dir=$this->transact_path($dir); 

        if($this->is_utf8($dir))
   		{
   			$dir=iconv('utf-8','gbk',$dir); 
   		}
		
   		$is_empty=true;
  		
		$files=scandir($dir);
		if(!empty($files))
		{
			foreach($files as $key=>$item)
			{
				if($item!='.' && $item!='..')
				{
					$is_empty=false;
				}
			}
		}
		
		return $is_empty;
     }  

     /**
      * 删除目录以及子目录的内容  
      */
     public function delete_dir($dir,$delete_self=false)
     {  
			//删除所有文件
     		$this->clear_dir($dir);
			//删除所有文件夹
			$dirs=$this->get_dirs($dir);
			if(!empty($dirs))
			{
				krsort($dirs);
				
				foreach($dirs as $dir)
				{
					@rmdir($dir);
				}
			}
			
			if($delete_self===true)
			{
		        if($this->is_utf8($dir))
		   		{
		   			$dir=iconv('utf-8','gbk',$dir); 
		   		} 
				@rmdir($dir);
			}
     }  
	
     /**
      * 删除目录以及子目录的所有文件，但是不删除目录
      */
     public function clear_dir($dir,$file_ext='')
     {  
			$file_list=$this->get_files($dir,$file_ext);
			if(!empty($file_list))
			{
				foreach($file_list as $key=>$item)
				{
					@unlink($item);
				}
			}
     }      

    /**
     * 处理路径
     */
 	public function transact_path($path)
 	{
 	    $path=preg_replace('/\\\/','/',$path);//把\替换为/
		$path=preg_replace('|\/+|','/',$path);//去掉重复的/   	
    	
    	if($this->get_substr($path,-1,1)!='/')
    	{
			$path=$path.'/';
    	}
    	
        if($this->is_utf8($path))
   		{
   			$path=iconv('utf-8','gbk',$path); 
   		}    	
    	return $path;
 	}
     
     /**
      * 写文件，append追加，rewrite覆盖
      */
    public function write_file($path,$file,$str,$op='rewrite')
    {
        $path=$this->transact_path($path);
        
        if($this->is_utf8($path))
   		{
   			$path=iconv('utf-8','gbk',$path); 
   		} 

        if($this->is_utf8($file))
   		{
   			$file=iconv('utf-8','gbk',$file); 
   		} 
    	
    	if(!file_exists($path))//路径不存在
    	{
    		if(false===($this->create_dir($path)))//建立路径
    		{
    			return false;//建立路径失败
    		}
    	}
    	
        if($op=='append')
		{
  			$f_handle=fopen($path.$file,'ab');
  			if(!fwrite($f_handle,$str))
  			{
  				return false;
  			}
  			fclose($f_handle);	
    	}
    	elseif($op=='rewrite')
    	{
			$f_handle=fopen($path.$file,'wb');
    	  	if(!fwrite($f_handle,$str))
  			{
  				return false;
  			}
			fclose($f_handle);	
    	} 	

        if(!file_exists($path.$file))
    	{
    		return false;
    	}
    	else{
    		return true;
    	} 	
    }
    
    /*
     * 读文件
     */
    public function read_file($path,$file)
    {
        $path=$this->transact_path($path);
        
        if($this->is_utf8($path))
   		{
   			$path=iconv('utf-8','gbk',$path); 
   		} 

        if($this->is_utf8($file))
   		{
   			$file=iconv('utf-8','gbk',$file); 
   		} 
    
    	if(!file_exists($path.$file))
     	{
     		return false;
     	}
 
    	$f_handle=fopen($path.$file,'r');
    	
    	if($f_handle===false)
    	{
    		return false;
    	}
    	
    	$contents = "";
		while (!feof($f_handle))
		{
  			$contents .= fread($f_handle, 8192);
			}
		fclose($f_handle);
		return $contents;
    }	
    
    /*
     * 获得文件上次访问的时间
     */
    public function file_a_time($path,$file)
    {
        $path=$this->transact_path($path);
        
        if($this->is_utf8($path))
   		{
   			$path=iconv('utf-8','gbk',$path); 
   		} 

        if($this->is_utf8($file))
   		{
   			$file=iconv('utf-8','gbk',$file); 
   		} 
        return fileatime($path.$file);
    }
    
    /*
     * 获得文件上次修改的时间
     */
    public function file_m_time($path,$file='')
    {
        $path=$this->transact_path($path);
        
        if($this->is_utf8($path))
   		{
   			$path=iconv('utf-8','gbk',$path); 
   		} 

        if($this->is_utf8($file))
   		{
   			$file=iconv('utf-8','gbk',$file); 
   		} 
        return filemtime($path.$file);
    }   
    
    /*
     * 获取某个目录下的所有子目录
     */
    private function get_dirs_cascade($path)
    {
     	$files=scandir($path);
        
        if(!empty($files))
        {
        	foreach($files as $key=>$item)
        	{
				if($item=='.' || $item=='..')
				{
					unset($files[$key]);
					continue;
				}
				else
				{
					if(mb_substr($path,-1,1,'gbk')=='/')
					{
						$tmp=$path.$item;
					}
					else{
						$tmp=$path.'/'.$item;
					}

					if(is_dir($tmp))
					{
						$files[$key]=$tmp;
						$sub_files=$this->get_dirs_cascade($tmp);
						if(!empty($sub_files))
						{
							$files[]=$sub_files;
						}
					}
					else{
						unset($files[$key]);
					}
				}
        	}
        }
        
        return $files;
    }    
    
    /*
     * 获取某个目录下的所有文件
     * $file_ext是文件扩展名，如不空，那么获取某个目录下的所有带$file_ext扩展名的文件
     */
    private function get_files_cascade($path,$file_ext='')
    {
    	$files=scandir($path);
        
    	//return $files;
    	
        if(!empty($files))
        {
        	foreach($files as $key=>$item)
        	{
				if($item=='.' || $item=='..')
				{
					unset($files[$key]);
					continue;
				}
				else
				{
					if(mb_substr($path,-1,1,'gbk')=='/')
					{
						$tmp=$path.$item;
					}
					else{
						$tmp=$path.'/'.$item;
					}
					
					if(is_dir($tmp))
					{
						$files[$key]=$this->get_files_cascade($tmp,$file_ext);
					}
					else
					{
						if(!empty($file_ext))
						{
							if($this->get_file_ext($tmp)==$file_ext)
							{
								$files[$key]=$tmp;
							}
							else{
								unset($files[$key]);
							}
						}
						else{
							$files[$key]=$tmp;
						}
					}
				}
        	}
        }
        
        return $files;
    }
    
    /*
     * 获取某个文件夹下面的所有文件
     * 注意返回的文件名是以gbk编码的
     * $file_ext是文件扩展名，如不空，那么获取某个目录下的所有带$file_ext扩展名的文件
     */
   	public function get_files($path,$file_ext='')
   	{
   		$path=$this->transact_path($path);
   		
   		if($this->is_utf8($path))
   		{
   			$path=iconv('utf-8','gbk',$path); 
   		}
   		
   		if(!file_exists($path))
   		{
   			return array();
   		}
   		else{
	   		$files_array=$this->get_files_cascade($path,$file_ext);
	   		
	   		require_once(dirname(__FILE__) . '/cls_array.php');
	   		
	   		$cls_array=new cls_array();
	   		
	   		return $cls_array->flat_array($files_array);   		
   		}
   	}
   	
    /*
     * 获取某个文件夹下面的所有文件夹
     * 注意返回的文件夹名是以gbk编码的
     */   	
   	public function get_dirs($path)
   	{
   	   	$path=$this->transact_path($path);
   		
   		if($this->is_utf8($path))
   		{
   			$path=iconv('utf-8','gbk',$path); 
   		}  
   		
   	   	if(!file_exists($path))
   		{
   			return array();
   		}
   		else{
    		$dirs=$this->get_dirs_cascade($path);
   		
    		require_once(dirname(__FILE__) . '/cls_array.php');
   		
   			$cls_array=new cls_array();
   		
   			return $cls_array->flat_array($dirs);   		
   		}  
   	}
   	
   	/*
   	 * 获得某个文件（可能含路径）的扩展名
   	 */
   	public function get_file_ext($filename)
   	{
   		$filename=$this->transact_path($filename);
   		$filename=basename($filename);
   		
   		$last_dot_pos=$this->get_strrpos($filename,'.');
   		
   		if($last_dot_pos===false)
   		{
   			return false;
   		}
   		else{
   			return $this->get_substr($filename,$last_dot_pos+1,$this->get_strlen($filename)-$last_dot_pos);
   		}
   	}

}

?>